# -*- coding: UTF-8 -*-
"""
@Project ：swift-forge-engine 
@File    ：order_by.py
@IDE     ：PyCharm 
@Author  ：Tony.Gan
@Date    ：2025/3/16 23:22 
@Des     ：
"""
from sqlalchemy import asc, desc


def apply_dynamic_sort(
        stmt,
        model,
        sort_field: str = None,
        sort_order: str = "desc",
        default_sort_field: str = "created_time",  # 新增默认排序字段参数
):
    """
    动态应用排序到 SQLAlchemy 查询语句
    :param stmt: 原查询语句
    :param model: SQLAlchemy 模型类
    :param sort_field: 排序字段名（可选）
    :param sort_order: 排序方式（asc/desc，默认desc）
    :param default_sort_field: 默认排序字段（当无有效排序字段时使用）
    :return: 修改后的查询语句
    """
    try:
        # 优先尝试用户指定的排序字段
        if sort_field:
            sort_column = getattr(model, sort_field, None)
            if sort_column is not None:
                order_func = asc if sort_order.lower() == "asc" else desc
                return stmt.order_by(order_func(sort_column))

        # 其次使用默认排序字段（由调用方指定）
        sort_column = getattr(model, default_sort_field, None)
        if sort_column is not None:
            order_func = asc if sort_order.lower() == "asc" else desc
            return stmt.order_by(order_func(sort_column))

        # 最终回退逻辑（当默认字段也不存在时）
        raise AttributeError(f"模型 {model.__name__} 中未找到字段 '{default_sort_field}'")

    except Exception:
        # 异常时尝试使用最安全的后备方案
        if hasattr(model, "id"):  # 假设所有表都有 id 字段
            return stmt.order_by(desc(model.id))
        else:
            return stmt  # 极端情况下放弃排序